/**
 * 正则验证工具
 * @module Regex
 */
import * as base from '@/common/sju.base.js'
import * as alert from '@/common/sju.alert.js'
// 默认配置
import { t } from '@/common/sju.i18n.js'

// 正则表达式常量
const REGEX = {
  USERNAME: /^[\u4E00-\u9FA5]{2,4}$/,
  PASSWORD: /^(?=.*[a-z])(?=.*\d)[a-z\d]{8,}$/i,
  PHONE: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
  ID_CARD: /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])([0-2][1-9]|10|20|30|31)\d{3}[0-9Xx]$/,
  MONEY: /^(?:[1-9]\d*|0)(?:\.\d{1,2})?$/,
  BANK_CARD: /^[1-9]\d{11,20}$/,
  EMAIL: /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i,
  TAX_NUM: /^[A-Z0-9]{15}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/,
  ALIPAY: /^(2[5-9]|30)\d{14,22}$/,
  UNION_PAY: /^62\d{17}$/
}

/**
 * 验证用户名(2-4个中文字符)
 * @param {string} val
 * @returns {boolean}
 */
function username(val) {
  return REGEX.USERNAME.test(val)
}

/**
 * 验证密码(8位以上字母+数字)
 * @param {string} val
 * @returns {boolean}
 */
function password(val) {
  return REGEX.PASSWORD.test(val)
}

/**
 * @description 检查注册手机号是否合法
 * <br/>this.$Regex_phonenumber -> this.sjuRegex.phoneNumber
 * @param {string} val 要检查的值
 */
function phoneNumber(val) {
  let regex_s = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
  if (regex_s.test(val)) {
    return true
  } else {
    return false
  }
}
	
/**
 * @description 检查身份证是否合法
 * <br/>this.$Regex_IDnumer -> this.sjuRegex.idCard
 * @param {string} val 要检查的值
 */
function idCard(val) {
  let regex_s = /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
  if (regex_s.test(val)) {
    return true
  } else {
    return false
  }
}

/**
 * @description 检查金额是否合法
 * @param {Number} val 要检查的值
 * this.$Regex_money -> this.sjuRegex.money
 */
function money(val) {
  let regex_s =
    /(^[1-9](\d+)?(\.\d{1,2})?$)|(^[1-9]$)|(^\d\.[1-9]{1,2}$)|(^\d\.[0]{1}[1-9]{1}$|(^\d\.[1-9]{1}[0]{1}$)$)/
  if (regex_s.test(val)) {
        return true
  } else {
    return false
  }
}

/**
 * @description 检查银行卡号是否合法
 * <br/>this.$Regex_Banknumber -> this.sjuRegex.bankNumber
 * @param {Number} val 要检查的值
 */
function bankNumber(str) {
  let regex_s = /^([1-9]{1})(\d{11}|\d{12}|\d{13}|\d{14}|\d{15}|\d{16}|\d{17}|\d{18}|\d{19}|\d{20}|\d{21})$/
  if (regex_s.test(str)) {
    return true
  } else {
    return false
  }
}

/**
 * @description 检查Email地址是否合法
 * <br/>this.$Regex_Email -> this.sjuRegex.Email
 * @param {Number} val 要检查的值
 */
function Email(str) {
  let regex_s = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
  if (regex_s.test(str)) {
    return true
  } else {
    return false
  }
}
	
/**
 * @description 检查税号是否合法
 * <br/>this.$Regex_TaxNum -> this.sjuRegex.TaxNum
 * @param {Number} val 要检查的值
 */
function TaxNum(str) {
  let regex_s = /^[A-Z0-9]{15}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/
  if (regex_s.test(str)) {
    return true
  } else {
    return false
  }
}
	
/**
 * @description 检查支付宝扫码的值
 * <br/>this.$Regex_zfbNumber -> this.sjuRegex.zfbNumber
 * @param {Number} val 要检查的值
 */
function zfbNumber(str) {
  let regex_s = /^(2[5-9]|30)\d{14,22}$/
  if (regex_s.test(str)) {
    return true
  } else {
    return false
  }
}

/**
 * @description 检查银联扫码的值
 * <br/>this.$Regex_ylNumber -> this.sjuRegex.ylNumber
 * @param {Number} val 要检查的值
 */
function ylNumber(str) {
  let regex_s = /^62\\d{17}$/
  if (regex_s.test(str)) {
    return true
  } else {
    return false
  }
}

/**
 * @description 多个属性值一起检查,有一个不合法,则返回false,并显示错误提示 
 * @param {array} arr 要检查数据的数组描述
 * <br/>参数格式:[{val:'属性值',type:'检查类型',msg:'错误提示'} ... ] 
 * <br/>例如: [{val:'12',type:'bankNumber',msg:'xx不是银行卡号'},...]
 */
/**
 * 批量验证多个字段
 * @param {Array<{val: *, type: string, msg: string}>} arr
 * @returns {boolean}
 */
function checkArray(arr) {
  if (!Array.isArray(arr)) {
    alert.showError(t('common.validation.must_array'), t('validation.alert_title'))
    return false
  }

  for (const item of arr) {
    if (!this[item.type]) {
      alert.showError(t('common.validation.unsupported_type', { type: item.type }), t('validation.alert_title'))
      return false
    }
    if (!this[item.type](item.val)) {
      alert.showError(item.msg, t('common.validation.failed'))
      return false
    }
  }
  return true
}

export {
  username,
  password,
  phoneNumber,
  idCard,
  money,
  bankNumber,
  Email,
  TaxNum,
  zfbNumber,
  ylNumber,
  checkArray
}
